<?php
//date() 格式化一个本地时间／日期
echo date("北京时间：Y年m月d日 H:i:s.v e\n");

//DateTime对象的创建及格式化
$d=new DateTime(); //当前日期
print_r($d);
echo $d->format("北京时间：Y年m月d日 H:i:s.v e\n");
echo "-------------------------\n";
$a=[ new DateTime(), //默认是now
    new DateTime("now"),
    new DateTime("today"),
    new DateTime("yesterday", new DateTimeZone("UTC")),
    new DateTime('2025-9-1'),
    new DateTime('2025-9-1 8:20:30'),
];
foreach ($a as $d) {
    echo $d->format("北京时间：Y年m月d日 H:i:s.v e\n");
}

//getTimestamp() 获取Unix时间戳
$second=(new DateTime('1970-1-1'))->getTimestamp();
print_r($second);
echo 8*60*60,"\n";
$d=new DateTime('@0');
echo $d->format("世界协调时：Y年m月d日 H:i:s.v e\n");

//日期的修改
$d->setTimezone(new DateTimeZone("Asia/Shanghai"));
echo $d->format("北京时间：Y年m月d日 H:i:s.v e\n");
$d=new DateTime("now 12:34:56");
echo $d->format("北京时间：Y年m月d日 H:i:s.v e\n");
//DateTimeInterface接口，两个类：DateTime、DateTimeImmutable实现了这个接口
//修改时DateTime对本的值会发生改变，DateTimeImmutable本身的值不会改变，会返回新的对象
$d=new DateTimeImmutable("now 12:34:56");
$dn=$d->modify("2000-8-10"); //修改日期
echo $dn->format("北京时间：Y年m月d日 H:i:s.v e\n");
$dn=$d->modify("23:45:59"); //修改时间
echo $dn->format("北京时间：Y年m月d日 H:i:s.v e\n");
$dn=$d->modify("monday this week"); //同一周的星期一的日期
echo $dn->format("北京时间：Y年m月d日 H:i:s.v e\n");
$dn=$d->modify("monday"); //下一周的星期一的日期，相当于"monday next week"
echo $dn->format("北京时间：Y年m月d日 H:i:s.v e\n");
$dn=$d->modify("monday last week"); //上一周的星期一的日期
echo $dn->format("北京时间：Y年m月d日 H:i:s.v e\n");
$dn=$d->modify("first day of this month"); //本月第一天的日期
echo $dn->format("北京时间：Y年m月d日 H:i:s.v e\n");
$dn=$d->modify("-2 days"); //前两天的日期
echo $dn->format("北京时间：Y年m月d日 H:i:s.v e\n");
$dn=$d->modify("+2 days 2 hours 3 minutes 10 seconds"); //前两天的日期
echo $dn->format("北京时间：Y年m月d日 H:i:s.v e\n");
//根据现在是第几周反算开学的日期
$zhou=7;//当前是第7周
echo (new DateTime())
    ->modify("monday next week")
    ->modify("-$zhou weeks")
    ->format("开学日期：Y年m月d日 H:i:s\n");

echo (new DateTime())
    ->modify("monday next week -$zhou weeks")
    ->format("开学日期：Y年m月d日 H:i:s\n");

//本月第1天星期几
echo (new DateTime())->modify("first day of this month")->format("本月1号是星期：N\n");
$a=[1=>'一','二','三','四','五','六','日'];
$w=(new DateTime())->format("N"); //'1'-星期一，..., '7'-星期日
echo ("今天是星期{$a[$w]}\n");


//本月有几天
echo  (new DateTime())->format("本月共有：t天\n");

function lunarCalendar(int $year, int $month): void
{
    $firstDay = new DateTime("$year-$month-01");
    $days = (int)$firstDay->format('t');
    $firstWeekDay = (int)$firstDay->format('w');
    if ($firstWeekDay == 0) {
        $firstWeekDay = 7;
    }

    echo "一 二 三 四 五 六 日\n";
    for ($i = 1; $i < $firstWeekDay; $i++) {
        echo "   ";
    }

    for ($day = 1; $day <= $days; $day++) {
        echo $day < 10 ? " $day " : "$day ";

        if (($firstWeekDay + $day - 1) % 7 == 0) {
            echo "\n";
        }
    }
    echo "\n";
}
lunarCalendar(2025,10);
